{{>licenseInfo}}
#pragma once

#include "CoreMinimal.h"
#include "{{modelNamePrefix}}BaseModel.h"

{{#cppNamespaceDeclarations}}
namespace {{this}} 
{
{{/cppNamespaceDeclarations}}

class {{dllapi}} {{classname}}
{
public:
	{{classname}}();
	~{{classname}}();

	void SetURL(const FString& Url);
	void AddHeaderParam(const FString& Key, const FString& Value);
	void ClearHeaderParams();

	{{#operations}}{{#operation}}class {{operationIdCamelCase}}Request;
	class {{operationIdCamelCase}}Response;
	{{/operation}}{{/operations}}
    {{#operations}}{{#operation}}DECLARE_DELEGATE_OneParam(F{{operationIdCamelCase}}Delegate, const {{operationIdCamelCase}}Response&);
    {{/operation}}{{/operations}}
    {{#operations}}{{#operation}}{{#description}}/* {{{description}}} */
	{{/description}}bool {{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate = F{{operationIdCamelCase}}Delegate()) const;
    {{/operation}}{{/operations}}
private:
    {{#operations}}{{#operation}}void On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const;
    {{/operation}}{{/operations}}
	bool IsValid() const;
	void HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, Response& InOutResponse) const;

	FString Url;
	TMap<FString,FString> AdditionalHeaderParams;
};
	
{{#cppNamespaceDeclarations}}
}
{{/cppNamespaceDeclarations}}
